package com.corpgovernment.organization.service;

import com.corpgovernment.api.basic.request.MbUserDeviceRequest;
import com.corpgovernment.api.basic.request.UpdatePasswordRequest;
import com.corpgovernment.api.basic.request.UserLoginRequest;
import com.corpgovernment.api.basic.vo.UserLoginResponseVo;
import com.corpgovernment.api.organization.bo.GetUserInfoRequestBO;
import com.corpgovernment.api.organization.model.message.SendMsgRequest;
import com.corpgovernment.api.organization.model.user.login.MbUserLoginVo;
import com.corpgovernment.api.organization.model.user.login.PageByConditionRequest;
import com.corpgovernment.api.organization.model.user.login.UserInfoType;
import com.corpgovernment.api.organization.model.user.login.UserLoginType;
import com.corpgovernment.common.base.BaseUserInfo;
import com.corpgovernment.common.base.Page;
import com.corpgovernment.organization.entity.db.MbUserLogin;
import com.corpgovernment.organization.vo.UserLoginRequestVO;
import com.corpgovernment.organization.vo.tenant.SearchTenantInfoRequestVO;
import com.corpgovernment.organization.vo.tenant.SearchTenantInfoResponseVO;

import java.util.List;
import java.util.Map;

/**
 * @author ：llw
 * @date ：Created in 2020/12/15 19:20
 * @description：
 * @modified By：
 * @version: $
 */
public interface IUserLoginService {

	/**
	 * 根据手机号查询登录用户
	 *
	 * @param countryCode
	 * @param phoneNum
	 * @return
	 */
	MbUserLogin findByPhone(String countryCode, String phoneNum);

	/**
	 * 插入登录用户
	 *
	 * @param userLogin
	 * @return
	 */
	boolean create(MbUserLogin userLogin);

	/**
	 * 根据UID删除登录用户
	 *
	 * @param Uid
	 * @return
	 */
	boolean deleteByUid(String Uid);

	/**
	 * 根据条件批量查询（未删除）
	 *
	 * @param queryParam
	 * @return
	 */
	List<MbUserLogin> list(MbUserLogin queryParam);

	/**
	 * 根据uid查询
	 *
	 * @param uid
	 * @return
	 */
	MbUserLogin getByUid(String uid);


	List<MbUserLogin> getByUids(List<String> uids);

	/**
	 * 更新密码
	 *
	 * @param userLogin
	 * @return
	 */
	int updatePwd(MbUserLogin userLogin);

	/**
	 * 根据PhoneNum和CountryCode和BgUser查询用户登录信息
	 *
	 * @param phoneNum
	 * @param countryCode
	 * @param bgUser
	 * @return
	 */
	MbUserLogin getByPhoneNumAndCountryCodeAndBgUser(String phoneNum, String countryCode, Boolean bgUser);

	/**
	 * 验证更新的密码
	 *
	 * @param uid
	 * @param pwd
	 * @return
	 */
	String validateUpdatePwd(String uid, String pwd);

	/**
	 * 重置密码(admin管理后台)
	 *
	 * @param uid
	 * @return
	 */
	String resetPwdByUid(String uid);

	/**
	 * 绑定手机号
	 *
	 * @param userInfo
	 * @param request
	 * @return
	 */
	Boolean bindPhone(BaseUserInfo userInfo, UserLoginRequest request);

	/**
	 * 发送绑定验证码
	 *
	 * @param accountName
	 * @param phoneNum
	 * @param countryCode
	 * @param bgUser
	 * @return
	 */
	String sendBindMsgCode(String accountName, String phoneNum, String countryCode, Boolean bgUser);

	/**
	 * 解绑手机
	 *
	 * @param accountName
	 * @param phoneNum
	 * @param msgCode
	 * @param countryCode
	 * @param source
	 * @return
	 */
	String unBindPhone(String accountName, String phoneNum, String msgCode, String countryCode, String source);

	/**
	 * 修改员工手机号-发送短信
	 *
	 * @param accountName
	 * @param phoneNum
	 * @param countryCode
	 * @param source
	 * @return
	 */
	String sendUploadStaffMsgCode(String accountName, String phoneNum, String countryCode, String source);


	/**
	 * 修改员工手机号
	 *
	 * @param accountName
	 * @param phoneNum
	 * @param countryCode
	 * @param source
	 * @return
	 */
	Boolean checkUploadStaffMsgCode(String accountName, String phoneNum,  String mesCode, Boolean isSyncLoginPhone, String countryCode, String source);

	/**
	 * 修改员工手机号
	 *
	 * @param accountName
	 */
	Boolean testNetty(String accountName);



	/**
	 * 换绑手机
	 *
	 * @param accountName
	 * @param unBindPhoneNum 解绑的手机号
	 * @param unBindMsgCode  解绑的验证码
	 * @param bindMsgCode 绑定的验证码
	 * @param source
	 * @return
	 */
	UserLoginResponseVo changeBindPhone(String accountName, String unBindMsgCode,String unBindCountryCode,String unBindPhoneNum, String bindMsgCode, String bindCountryCode, String bindPhoneNum,String source);

	/**
	 * 发送解绑短信
	 *
	 * @param accountName
	 * @param phoneNum
	 * @param countryCode
	 * @return
	 */
	String sendUnbindMsg(String accountName, String phoneNum, String countryCode);

	/**
	 * 验证重置密码短信验证码
	 *
	 * @param request
	 * @return
	 */
	UserLoginResponseVo validateResetPwdMsgCode(MbUserLoginVo request);

	/**
	 * 发送重置密码的验证码
	 *
	 * @param request
	 * @return
	 */
	String sendResetPwdMsgCode(MbUserLoginVo request);

	/**
	 * 根据原始密码修改密码（含管理员）
	 *
	 * @param request
	 * @return
	 */
	Boolean updatePassword(UpdatePasswordRequest request,BaseUserInfo userInfo);

	/**
	 * 根据原始密码修改密码（含管理员）
	 *
	 * @param request
	 * @return
	 */
	UserLoginResponseVo validateUpdatePassword(UpdatePasswordRequest request);

	/**
	 * 根据原始密码修改密码
	 *
	 * @param baseUserInfo 用户基本信息
	 * @param request      修改密码请求
	 * @return 密码修改结果
	 */
	Boolean updatePwd(BaseUserInfo baseUserInfo, UserLoginRequest request);

	/**
	 * 发送登录验证码(前/后台)
	 *
	 * @param request 发送登录验证码请求
	 * @return 发送登录验证码结果
	 */
	String sendMsgCode(MbUserLoginVo request);

	/**
	 * 是否是后台用户
	 *
	 * @param request
	 * @param isBgUser
	 * @return
	 */
	Boolean saveOrUpdate(MbUserLoginVo request, boolean isBgUser);

	/**
	 * 更新登录用户
	 *
	 * @param request
	 * @param isSyncLoginPhone 是否同步登录手机号
	 * @return
	 */
	Boolean saveOrUpdate(MbUserLoginVo request, boolean isBgUser, Boolean isSyncLoginPhone);

	Boolean updateNameAndPhone(MbUserLoginVo request, boolean bgUser);

	/**
	 * 更新
	 *
	 * @param updateParam
	 * @return
	 */
	Boolean update(MbUserLogin updateParam);

	Boolean updateByUid(MbUserLogin updateParam);

	/**
	 * 登录
	 *
	 * @param request
	 * @return
	 */
	UserLoginResponseVo login(MbUserLoginVo request);

	/**
	 * 确认身份登录(前台)
	 *
	 * @param request 确认身份登录请求
	 * @return 确认身份结果
	 */
	UserLoginResponseVo confirmLogin(UserLoginRequest request);

	/**
	 * 短信验证码登录
	 *
	 * @param request 短信验证码登录
	 * @return 登录结果
	 */
	UserLoginResponseVo validateMsgCode(MbUserLoginVo request);

	/**
	 * @param baseUserInfo 用户基本信息(改密后登录)
	 * @param request      修改密码请求
	 * @return JSONResult 修改结果
	 */
	UserLoginResponseVo updatePwdLogin(BaseUserInfo baseUserInfo, UserLoginRequest request);

	/**
	 * 重置密码
	 *
	 * @param request 重置密码请求
	 * @return 重置结果
	 */
	UserLoginResponseVo resetPwdMsgCode(UserLoginRequest request);

	/**
	 * 登出
	 *
	 * @param userInfo
	 * @param uuid
	 * @param deviceId
	 * @return
	 */
	Boolean logout(Map<String, Object> userInfo, String uuid, String deviceId);

	Boolean updateDeviceId(BaseUserInfo userInfo, MbUserDeviceRequest request);

	int updateUserLogin(MbUserLogin userLogin, boolean isCover);

	/**
	 * 分页查询
	 *
	 * @param request
	 * @return
	 */
	Page<UserInfoType> pageByCondition(PageByConditionRequest request);

	/**
	 * 保存账号信息
	 *
	 * @param userLogin
	 * @return
	 */
	Boolean save(UserLoginType userLogin);

	/**
	 * 发送短信
	 *
	 * @param request
	 * @return
	 */
	Boolean sendSmsMsg(SendMsgRequest request);

	/**
	 * 查询租户信息
	 *
	 * @param request
	 * @return
	 */
	SearchTenantInfoResponseVO searchTenantInfo(SearchTenantInfoRequestVO request);

	/**
	 * 刷新refreshToken
	 *
	 * @param refreshToken
	 * @return
	 */
	UserLoginResponseVo refresh(String refreshToken);

	/**
	 * 获取用户信息
	 *
	 * @param request
	 * @return
	 */
	BaseUserInfo getUserInfo(GetUserInfoRequestBO request);

	BaseUserInfo getUserInfoV2(GetUserInfoRequestBO request);

	/**
	 * 更新用户状态
	 *
	 * @param request
	 * @param userInfo
	 * @return
	 */
	Boolean updateUserStatus(UserLoginRequestVO request, BaseUserInfo userInfo);
}